# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/9 13:59 
@Author  : ZhangShenao 
@File    : deep_copy.py 
@Desc    : deep copy深拷贝
deep copy深度拷贝,是指重新分配一块内存,创建一个新的对象
并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中
因此,新对象和原对象没有任何关联

可以通过内置函数copy.deepcopy()来创建深拷贝

对于深拷贝来说,如果被拷贝对象中存在指向自身的引用,那么程序很容易陷入无限递归
为了解决这个问题,因为深度拷贝函数deepcopy 中会维护一个字典,记录已经拷贝的对象与其ID
拷贝过程中,如果字典里已经存储了将要拷贝的对象,则会从字典直接返回
"""
import copy


def create_deep_copy():
    """创建深拷贝"""

    # 创建原始对象
    l1 = [[1, 2], (30, 40)]

    # 使用copy.deepcopy()创建深拷贝
    l2 = copy.deepcopy(l1)

    # l1和l2是完全两个独立的对象,不会互相影响
    l1.append(100)
    l1[0].append(3)
    l1[1] += (50, 60)

    print(l1)  # [[1, 2, 3], (30, 40, 50, 60), 100]
    print(l2)  # [[1, 2], (30, 40)]


def recursive_deep_copy():
    """deepcopy函数通过缓存已经拷贝过的对象,解决了深度拷贝过程中的无限递归问题"""

    # 创建原始对象,内部包含指向自身的引用
    x = [1]
    x.append(x)
    print(f'x = {x}')  # x = [1, [...]]

    # 创建原始对象的深拷贝
    y = copy.deepcopy(x)
    print(f'y = {y}')  # y = [1, [...]]

    # x和y都是一个无限嵌套的list,二者的比较需要逐个元素进行比较,会触发RecursionError: maximum recursion depth exceeded in comparison
    # print(f'x == y? {x == y}')  # RecursionError: maximum recursion depth exceeded in comparison


if __name__ == '__main__':
    # create_deep_copy()

    recursive_deep_copy()
